package com.easy.service.impl;

import com.easy.bean.Admin;
import com.easy.bean.Carousel;
import com.easy.mapper.AdminDao;
import com.easy.mapper.AttractionDao;
import com.easy.mapper.CarouselDao;
import com.easy.mapper.UserDao;
import com.easy.service.ImageCleanupService;
import com.easy.util.ImageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Transactional(rollbackFor = Exception.class)
public class ImageCleanupServiceImpl implements ImageCleanupService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private AdminDao adminDao;

    @Autowired
    private CarouselDao carouselDao;

    @Scheduled(cron = "0 0 2 * * ?")
    @Override
    public void cleanupUnusedImages() {
        // 1. 获取数据库中所有正在使用的图片URL
        List<String> usedImageUrls = getUsedImageUrls();

        // 2. 从URL中提取文件名
        List<String> usedFileNames = extractFileNames(usedImageUrls);

        // 3. 获取OSS中所有文件名
        List<String> allOssFileNames = ImageUtil.listAllObjects();

        // 4. 找出未使用的文件名
        List<String> unusedFileNames = allOssFileNames.stream()
                .filter(name -> !usedFileNames.contains(name))
                .collect(Collectors.toList());

        // 5. 删除未使用的文件
        if (!unusedFileNames.isEmpty()) {
            ImageUtil.batchDelete(unusedFileNames);
            System.out.println("已删除 " + unusedFileNames.size() + " 个未使用的图片文件");
        } else {
            System.out.println("没有发现未使用的图片文件");
        }
    }

    /**
     * 获取数据库中所有正在使用的图片URL
     * @return 图片URL列表
     */
    private List<String> getUsedImageUrls() {
        List<String> imageUrls = new ArrayList<>();

        // 获取所有用户头像URL
        userDao.all(null).forEach(user -> {
            if (user.getPhoto() != null && user.getPhoto().startsWith("https://")) {
                imageUrls.add(user.getPhoto());
            }
        });

        // 获取所有管理员头像URL (如果Admin实体也有photo字段)
         adminDao.all(null).forEach(admin -> {
             if (admin.getPhoto() != null && admin.getPhoto().startsWith("https://")) {
                 imageUrls.add(admin.getPhoto());
             }
         });

        // 获取所有轮播图图片URL
        carouselDao.getAll().forEach(carousel -> {
            if (carousel.getImageUrl() != null && carousel.getImageUrl().startsWith("https://")) {
                imageUrls.add(carousel.getImageUrl());
            }
        });

        // 可以添加其他包含图片URL的表

        return imageUrls;
    }

    /**
     * 从完整URL中提取文件名
     * @param urls 完整URL列表
     * @return 文件名列表
     */
    private List<String> extractFileNames(List<String> urls) {
        return urls.stream()
                .map(url -> {
                    // 从URL中提取文件名，例如从 "https://bucket.oss-cn-beijing.aliyuncs.com/filename.jpg" 提取 "filename.jpg"
                    int lastSlashIndex = url.lastIndexOf("/");
                    if (lastSlashIndex >= 0 && lastSlashIndex < url.length() - 1) {
                        return url.substring(lastSlashIndex + 1);
                    }
                    return url;
                })
                .collect(Collectors.toList());
    }
}
